from PySide6.QtWidgets import (QDialog,QLayout,QVBoxLayout,QHBoxLayout,QLabel,QLineEdit,QGroupBox,
                               QRadioButton,QCheckBox,QPushButton)
from PySide6.QtCore import Qt
from custom_plain_text_edit import PlainTextEdit
from PySide6.QtGui import QTextDocument

class FindTextDialog(QDialog):
    """查找(文本)对话框

    :param QDialog: PySide6 QDialog对话框
    """
    def __init__(self,parent=None):
        """初始化

        :param parent: 父窗口, defaults to None
        :param plain_text_edit: 纯文本编辑, defaults to None
        """
        super().__init__(parent)
        self.setup_ui()    

    def setup_ui(self):
        """设置界面
        """
        # 窗口标题设置 wayland 不支持 仅设置窗口关闭按钮
        self.setWindowTitle("查找")

        # 窗口按钮只显示 关闭 win11默认 x11 wayland 不支持
        
        # 主布局使用垂直布局
        global_vbox = QVBoxLayout(self)
        
        # 固定大小 x11 windows 支持 wayland 奇怪
        global_vbox.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)

        # 创建标签和行编辑 并设置伙伴关系 使用水平布局
        find_lb = QLabel("查找内容(&N)")
        self.find_le = QLineEdit()

        find_lb.setBuddy(self.find_le)

        ll_hbox = QHBoxLayout()
        ll_hbox.addWidget(find_lb)
        ll_hbox.addWidget(self.find_le)

        # 组框架 使用垂直布局 添加俩个圆角按钮: 向上和向下 默认向下
        direct_gb = QGroupBox(title="方向")

        gb_vbox = QVBoxLayout(direct_gb)
        
        self.__up_rbtn = QRadioButton("向上(&U)")
        self.__down_rbtn = QRadioButton("向下(&D)")

        self.__down_rbtn.setChecked(True)

        gb_vbox.addWidget(self.__up_rbtn)
        gb_vbox.addWidget(self.__down_rbtn)

        # 区分大小写、循环 复选框 添加到主布局中
        self.__case_check = QCheckBox("区分大小写(&C)")
        self.__range_check = QCheckBox("循环(&R)")

        # 查找下一个 与取消按钮
        self.__find_next_btn = QPushButton("查找下一个")
        self.__cancel_btn = QPushButton("取消")

        # 主布局添加布局 或控件
        global_vbox.addLayout(ll_hbox)
        global_vbox.addWidget(direct_gb)
        global_vbox.addWidget(self.__case_check)
        global_vbox.addWidget(self.__range_check)
        global_vbox.addWidget(self.__find_next_btn)
        global_vbox.addWidget(self.__cancel_btn)

    def set_event_bind(self,plain_text_edit: PlainTextEdit):
        """设置事件绑定
        """
        # 按钮选中绑定事件
        self.__find_next_btn.clicked.connect(lambda: self.auto_find_next(plain_text_edit))
        self.__cancel_btn.clicked.connect(self.close)
        
    def get_all_status(self) -> tuple[str,bool,bool,bool,bool]:
        """获取所有状态

        :return: 查找内容,上一个按钮勾选状态,下一个按钮勾选状态,忽略大小写勾选状态,循环勾选状态
        """
        return self.find_le.text(),self.__up_rbtn.isChecked(),self.__down_rbtn.isChecked(),self.__case_check.isChecked(),self.__range_check.isChecked()
    
    def auto_find_next(self,plain_text_edit: PlainTextEdit):
        """自动查找下一个
        """
        find_text = self.find_le.text()

        # 先使用二分法 判断是否 点击向上或向下
        if self.__down_rbtn.isChecked():
            plain_text_edit.find(find_text)

            # 再判断是否勾选 忽略大小写
            if self.__case_check.isChecked():
                flag = QTextDocument.FindFlag.FindCaseSensitively
                plain_text_edit.find(find_text,flag)
        else:
            # 向上查找
            flag = QTextDocument.FindFlag.FindBackward
            plain_text_edit.find(find_text,flag)

            # 再判断是否勾选 忽略大小写
            if self.__case_check.isChecked():
                flags = QTextDocument.FindFlag.FindCaseSensitively | flag
                plain_text_edit.find(find_text,flags)

            
        



        
        